import Big from 'big.js'
/**
 * 数值格式化转换器
 * 超过3位，通过逗号分隔
 * @param {String|Number} value
 * @param {String} options 配置选项
 * @param {String} options.symbol 前置符号，如 ￥、$ 等
 * @param {String} options.unit 后置单位，如 元、核时 等
 * @param {Number} options.dividedBy 数值除以倍数，用以单位转换，默认1
 * @param {Number} options.decimal 保留的小数位，默认2位
 * @param {String} options.nullReplacement 当输入值为空或undefined时的替换字符串
 */

export function formatNumber(num, options = {}) {
  const {
    decimal = 2,
    symbol = '',
    unit = '',
    dividedBy = 1,
    nullReplacement = ''
  } = options

  if (num === null || isNaN(num = parseFloat(num))) {
    return nullReplacement
  }
  num = num / dividedBy
  const value = Number(num).toFixed(decimal)
  const integer = Math.floor(Math.abs(value))

  // 将整数部分转换为字符串，并每3位添加逗号分隔符
  const formattedInteger = String(Math.abs(integer)).replace(/\B(?=(\d{3})+(?!\d))/g, ',')

  let formattedValue
  if (decimal > 0) {
    const decimalValue = String(Math.round((Math.abs(value) - integer) * Math.pow(10, decimal))).padStart(decimal, '0')
    formattedValue = formattedInteger + (decimalValue ? '.' + decimalValue : '')
  } else {
    formattedValue = formattedInteger
  }

  return symbol + (num < 0 ? '-' : '') + formattedValue + unit
}

/**
 * 传入数字数组，计算运算后的总数，支持加减，减法则传入负数, 默认保留两位小数
 * 超过3位，通过逗号分隔
 * @param {List[String|Number]} numList
 * @param {String} options 配置选项, 同formatNumber
 * @param {String} options.symbol 前置符号，如 ￥、$ 等
 * @param {String} options.unit 后置单位，如 元、核时 等
 * @param {Number} options.dividedBy 数值除以倍数，用以单位转换，默认1
 * @param {Number} options.decimal 保留的小数位，默认2位
 * @param {String} options.nullReplacement 当输入值为空或undefined时的替换字符串
 * @return {Number} 通过formatNumber处理后的数值
 */
export function calAndFormatNumber(numList=[], options={decimal:2}) {
  let result = new Big(0);
  const {decimal} = options
  numList.forEach(num => {
    result = result.plus(new Big(num).toFixed(decimal));
  });
  return formatNumber(result, options)
}

